/*
 * Copyright (c) 2019-2029, ZeusOS Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author            Notes
 * 2021-03-23     longmain       first version
 */

#ifndef __ZOS_PIN_H__
#define __ZOS_PIN_H__

#ifdef __cplusplus
extern "C" {
#endif

#include "zos_def.h"

#define PIN_2   2   //I2C_SCL_PIN
#define PIN_3   3   //I2C_SDA_PIN
#define PIN_5   5   //SYSTEM_LED_PIN
#define PIN_6   6   //SPI_MOSI_PIN
#define PIN_7   7   //SPI_MISO_PIN
#define PIN_8   8   //SPI_SCLK_PIN
#define PIN_9   9   //SPI_CS_PIN
#define PIN_10  10  //BOOT_PIN 开机前禁止上拉，默认下拉
#define PIN_11  11  //开机前禁止上拉，默认下拉
#define PIN_12  12  //开机前禁止上拉，默认下拉
#define PIN_13  13
#define PIN_15  15  //LOG_TXD
#define PIN_16  16  //LOG_RXD
#define PIN_20  20  //UART1_TX_PIN 
#define PIN_21  21  //UART1_RX_PIN


#define PIN_MAX 				22
#define PIN_ERROR 				-1
#define PIN_LOW                 0x00
#define PIN_HIGH                0x01

#define PIN_MODE_OUTPUT         0x00    /* 输 出 */
#define PIN_MODE_INPUT          0x01    /* 输 入 */
#define PIN_MODE_INPUT_PULLUP   0x02    /* 上 拉 输 入 */
#define PIN_MODE_INPUT_PULLDOWN 0x03    /* 下 拉 输 入 */
#define PIN_MODE_OUTPUT_OD      0x04    /* 开 漏 输 出 */


//#define PIN_IRQ_MODE_RISING             0x00  /* 上 升 沿 触 发 */
#define PIN_IRQ_MODE_FALLING            0x01    /* 下 降 沿 触 发 */
#define PIN_IRQ_MODE_RISING_FALLING     0x02    /* 边 沿 触 发 （上 升 沿 和 下 降 沿 都 触 发） */
#define PIN_IRQ_MODE_HIGH_LEVEL         0x03    /* 高 电 平 触 发 */
//#define PIN_IRQ_MODE_LOW_LEVEL          0x04  /* 低 电 平 触 发 */


#define PIN_IRQ_DISABLE                 0x00
#define PIN_IRQ_ENABLE                  0x01

#define PIN_IRQ_PIN_NONE                -1


struct zos_pin_irq_hdr
{
    zos_int16_t        pin;
    zos_uint16_t       mode;
    void (*hdr)(void *args);
    void             *args;
};

typedef void (*PIN_CALLBACK)(void);

/**
 *  \brief PIN 设置引脚模式
 *
 *  \param [in] pin     IO引脚号（0-22）
 *  \param [in] mode    
 *
 *  \return  ZOS_EOK:设置成功 , ZOS_ERROR:设置失败
 */
zos_err_t zos_pin_mode(zos_uint8_t pin, zos_base_t mode);

/**
 *  \brief PIN 反初始化引脚模式
 *
 *  \param [in] pin     IO引脚号（0-22）
 * 
 *  \return  ZOS_EOK:反初始化成功 , ZOS_ERROR:反初始化失败
 */
zos_err_t zos_pin_deinit(zos_uint8_t pin);

/**
 *  \brief PIN 设置引脚电平
 *
 *  \param [in] pin     IO引脚号（0-22）
 *  \param [in] value   0:PIN_LOW   1:PIN_HIGH
 * 
 *  \return  ZOS_EOK:设置成功 , ZOS_ERROR:设置失败
 */
zos_err_t zos_pin_write(zos_uint8_t pin, zos_base_t value);

/**
 *  \brief PIN 读取引脚电平
 *
 *  \param [in] pin     IO引脚号（0-22）
 * 
 *  \return  0:PIN_LOW   1:PIN_HIGH  ZOS_ERROR:引脚错误
 */
zos_err_t zos_pin_read(zos_uint8_t pin);

/**
 *  \brief PIN 绑定引脚中断回调函数
 *
 *  \param [in] pin         IO引脚号（0-22）
 *  \param [in] mode        中断触发模式
 *  \param [in] callback    中断回调函数（void (*PIN_CALLBACK)(void);）
 * 
 *  \return  ZOS_EOK:绑定成功 , ZOS_ERROR:绑定失败
 */
zos_err_t zos_pin_attach_irq(zos_uint8_t pin,zos_uint32_t mode, PIN_CALLBACK callback);

/**
 *  \brief PIN 脱离引脚中断回调函数
 *
 *  \param [in] pin         IO引脚号（0-22）
 * 
 *  \return  ZOS_EOK:脱离成功 , ZOS_ERROR:脱离失败
 */
zos_err_t zos_pin_detach_irq(zos_uint8_t pin);

/**
 *  \brief PIN 使能引脚中断
 *
 *  \param [in] pin         IO引脚号（0-22）
 *  \param [in] enabled     状态,可取 2 种值之一：PIN_IRQ_ENABLE（开启）PIN_IRQ_DISABLE（关闭）
 * 
 *  \return  ZOS_EOK:使能成功 , ZOS_ERROR:使能失败
 */
zos_err_t zos_pin_irq_enable(zos_uint8_t pin,zos_uint32_t enabled);


#ifdef __cplusplus
}
#endif
#endif //__ZOS_PIN_H__
